/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import entidades.Unidadorganizacional;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Quien;
import entidades.Direccion;
import entidades.Convenios;
import entidades.Conveniofinanciero;
import entidades.Proyecto;
import java.util.ArrayList;
import java.util.List;
import entidades.Estudios;
import entidades.Persona;
import entidades.Carro;

/**
 *
 * @author Andres
 */
public class UnidadorganizacionalJpaController {

    public UnidadorganizacionalJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Unidadorganizacional unidadorganizacional) throws IllegalOrphanException, PreexistingEntityException, Exception {
        if (unidadorganizacional.getProyectoList() == null) {
            unidadorganizacional.setProyectoList(new ArrayList<Proyecto>());
        }
        if (unidadorganizacional.getEstudiosList() == null) {
            unidadorganizacional.setEstudiosList(new ArrayList<Estudios>());
        }
        if (unidadorganizacional.getPersonaList() == null) {
            unidadorganizacional.setPersonaList(new ArrayList<Persona>());
        }
        if (unidadorganizacional.getCarroList() == null) {
            unidadorganizacional.setCarroList(new ArrayList<Carro>());
        }
        List<String> illegalOrphanMessages = null;
        Quien quienOrphanCheck = unidadorganizacional.getQuien();
        if (quienOrphanCheck != null) {
            Unidadorganizacional oldUnidadorganizacionalOfQuien = quienOrphanCheck.getUnidadorganizacional();
            if (oldUnidadorganizacionalOfQuien != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("The Quien " + quienOrphanCheck + " already has an item of type Unidadorganizacional whose quien column cannot be null. Please make another selection for the quien field.");
            }
        }
        if (illegalOrphanMessages != null) {
            throw new IllegalOrphanException(illegalOrphanMessages);
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Quien quien = unidadorganizacional.getQuien();
            if (quien != null) {
                quien = em.getReference(quien.getClass(), quien.getCodigo());
                unidadorganizacional.setQuien(quien);
            }
            Direccion direccion = unidadorganizacional.getDireccion();
            if (direccion != null) {
                direccion = em.getReference(direccion.getClass(), direccion.getCodigo());
                unidadorganizacional.setDireccion(direccion);
            }
            Convenios convenios = unidadorganizacional.getConvenios();
            if (convenios != null) {
                convenios = em.getReference(convenios.getClass(), convenios.getCodigoconvenio());
                unidadorganizacional.setConvenios(convenios);
            }
            Conveniofinanciero conveniofinanciero = unidadorganizacional.getConveniofinanciero();
            if (conveniofinanciero != null) {
                conveniofinanciero = em.getReference(conveniofinanciero.getClass(), conveniofinanciero.getCodigoconveniofinanciero());
                unidadorganizacional.setConveniofinanciero(conveniofinanciero);
            }
            List<Proyecto> attachedProyectoList = new ArrayList<Proyecto>();
            for (Proyecto proyectoListProyectoToAttach : unidadorganizacional.getProyectoList()) {
                proyectoListProyectoToAttach = em.getReference(proyectoListProyectoToAttach.getClass(), proyectoListProyectoToAttach.getCodigocongreso());
                attachedProyectoList.add(proyectoListProyectoToAttach);
            }
            unidadorganizacional.setProyectoList(attachedProyectoList);
            List<Estudios> attachedEstudiosList = new ArrayList<Estudios>();
            for (Estudios estudiosListEstudiosToAttach : unidadorganizacional.getEstudiosList()) {
                estudiosListEstudiosToAttach = em.getReference(estudiosListEstudiosToAttach.getClass(), estudiosListEstudiosToAttach.getCodigo());
                attachedEstudiosList.add(estudiosListEstudiosToAttach);
            }
            unidadorganizacional.setEstudiosList(attachedEstudiosList);
            List<Persona> attachedPersonaList = new ArrayList<Persona>();
            for (Persona personaListPersonaToAttach : unidadorganizacional.getPersonaList()) {
                personaListPersonaToAttach = em.getReference(personaListPersonaToAttach.getClass(), personaListPersonaToAttach.getCodigopersona());
                attachedPersonaList.add(personaListPersonaToAttach);
            }
            unidadorganizacional.setPersonaList(attachedPersonaList);
            List<Carro> attachedCarroList = new ArrayList<Carro>();
            for (Carro carroListCarroToAttach : unidadorganizacional.getCarroList()) {
                carroListCarroToAttach = em.getReference(carroListCarroToAttach.getClass(), carroListCarroToAttach.getPlaca());
                attachedCarroList.add(carroListCarroToAttach);
            }
            unidadorganizacional.setCarroList(attachedCarroList);
            em.persist(unidadorganizacional);
            if (quien != null) {
                quien.setUnidadorganizacional(unidadorganizacional);
                quien = em.merge(quien);
            }
            if (direccion != null) {
                Unidadorganizacional oldUnidadorganizacionalOfDireccion = direccion.getUnidadorganizacional();
                if (oldUnidadorganizacionalOfDireccion != null) {
                    oldUnidadorganizacionalOfDireccion.setDireccion(null);
                    oldUnidadorganizacionalOfDireccion = em.merge(oldUnidadorganizacionalOfDireccion);
                }
                direccion.setUnidadorganizacional(unidadorganizacional);
                direccion = em.merge(direccion);
            }
            if (convenios != null) {
                convenios.getUnidadorganizacionalList().add(unidadorganizacional);
                convenios = em.merge(convenios);
            }
            if (conveniofinanciero != null) {
                conveniofinanciero.getUnidadorganizacionalList().add(unidadorganizacional);
                conveniofinanciero = em.merge(conveniofinanciero);
            }
            for (Proyecto proyectoListProyecto : unidadorganizacional.getProyectoList()) {
                proyectoListProyecto.getUnidadorganizacionalList().add(unidadorganizacional);
                proyectoListProyecto = em.merge(proyectoListProyecto);
            }
            for (Estudios estudiosListEstudios : unidadorganizacional.getEstudiosList()) {
                estudiosListEstudios.getUnidadorganizacionalList().add(unidadorganizacional);
                estudiosListEstudios = em.merge(estudiosListEstudios);
            }
            for (Persona personaListPersona : unidadorganizacional.getPersonaList()) {
                Unidadorganizacional oldUnidadorganizacionalOfPersonaListPersona = personaListPersona.getUnidadorganizacional();
                personaListPersona.setUnidadorganizacional(unidadorganizacional);
                personaListPersona = em.merge(personaListPersona);
                if (oldUnidadorganizacionalOfPersonaListPersona != null) {
                    oldUnidadorganizacionalOfPersonaListPersona.getPersonaList().remove(personaListPersona);
                    oldUnidadorganizacionalOfPersonaListPersona = em.merge(oldUnidadorganizacionalOfPersonaListPersona);
                }
            }
            for (Carro carroListCarro : unidadorganizacional.getCarroList()) {
                Unidadorganizacional oldUnidadorganizacionalOfCarroListCarro = carroListCarro.getUnidadorganizacional();
                carroListCarro.setUnidadorganizacional(unidadorganizacional);
                carroListCarro = em.merge(carroListCarro);
                if (oldUnidadorganizacionalOfCarroListCarro != null) {
                    oldUnidadorganizacionalOfCarroListCarro.getCarroList().remove(carroListCarro);
                    oldUnidadorganizacionalOfCarroListCarro = em.merge(oldUnidadorganizacionalOfCarroListCarro);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findUnidadorganizacional(unidadorganizacional.getCodigounidad()) != null) {
                throw new PreexistingEntityException("Unidadorganizacional " + unidadorganizacional + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Unidadorganizacional unidadorganizacional) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Unidadorganizacional persistentUnidadorganizacional = em.find(Unidadorganizacional.class, unidadorganizacional.getCodigounidad());
            Quien quienOld = persistentUnidadorganizacional.getQuien();
            Quien quienNew = unidadorganizacional.getQuien();
            Direccion direccionOld = persistentUnidadorganizacional.getDireccion();
            Direccion direccionNew = unidadorganizacional.getDireccion();
            Convenios conveniosOld = persistentUnidadorganizacional.getConvenios();
            Convenios conveniosNew = unidadorganizacional.getConvenios();
            Conveniofinanciero conveniofinancieroOld = persistentUnidadorganizacional.getConveniofinanciero();
            Conveniofinanciero conveniofinancieroNew = unidadorganizacional.getConveniofinanciero();
            List<Proyecto> proyectoListOld = persistentUnidadorganizacional.getProyectoList();
            List<Proyecto> proyectoListNew = unidadorganizacional.getProyectoList();
            List<Estudios> estudiosListOld = persistentUnidadorganizacional.getEstudiosList();
            List<Estudios> estudiosListNew = unidadorganizacional.getEstudiosList();
            List<Persona> personaListOld = persistentUnidadorganizacional.getPersonaList();
            List<Persona> personaListNew = unidadorganizacional.getPersonaList();
            List<Carro> carroListOld = persistentUnidadorganizacional.getCarroList();
            List<Carro> carroListNew = unidadorganizacional.getCarroList();
            List<String> illegalOrphanMessages = null;
            if (quienNew != null && !quienNew.equals(quienOld)) {
                Unidadorganizacional oldUnidadorganizacionalOfQuien = quienNew.getUnidadorganizacional();
                if (oldUnidadorganizacionalOfQuien != null) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("The Quien " + quienNew + " already has an item of type Unidadorganizacional whose quien column cannot be null. Please make another selection for the quien field.");
                }
            }
            for (Persona personaListOldPersona : personaListOld) {
                if (!personaListNew.contains(personaListOldPersona)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Persona " + personaListOldPersona + " since its unidadorganizacional field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (quienNew != null) {
                quienNew = em.getReference(quienNew.getClass(), quienNew.getCodigo());
                unidadorganizacional.setQuien(quienNew);
            }
            if (direccionNew != null) {
                direccionNew = em.getReference(direccionNew.getClass(), direccionNew.getCodigo());
                unidadorganizacional.setDireccion(direccionNew);
            }
            if (conveniosNew != null) {
                conveniosNew = em.getReference(conveniosNew.getClass(), conveniosNew.getCodigoconvenio());
                unidadorganizacional.setConvenios(conveniosNew);
            }
            if (conveniofinancieroNew != null) {
                conveniofinancieroNew = em.getReference(conveniofinancieroNew.getClass(), conveniofinancieroNew.getCodigoconveniofinanciero());
                unidadorganizacional.setConveniofinanciero(conveniofinancieroNew);
            }
            List<Proyecto> attachedProyectoListNew = new ArrayList<Proyecto>();
            for (Proyecto proyectoListNewProyectoToAttach : proyectoListNew) {
                proyectoListNewProyectoToAttach = em.getReference(proyectoListNewProyectoToAttach.getClass(), proyectoListNewProyectoToAttach.getCodigocongreso());
                attachedProyectoListNew.add(proyectoListNewProyectoToAttach);
            }
            proyectoListNew = attachedProyectoListNew;
            unidadorganizacional.setProyectoList(proyectoListNew);
            List<Estudios> attachedEstudiosListNew = new ArrayList<Estudios>();
            for (Estudios estudiosListNewEstudiosToAttach : estudiosListNew) {
                estudiosListNewEstudiosToAttach = em.getReference(estudiosListNewEstudiosToAttach.getClass(), estudiosListNewEstudiosToAttach.getCodigo());
                attachedEstudiosListNew.add(estudiosListNewEstudiosToAttach);
            }
            estudiosListNew = attachedEstudiosListNew;
            unidadorganizacional.setEstudiosList(estudiosListNew);
            List<Persona> attachedPersonaListNew = new ArrayList<Persona>();
            for (Persona personaListNewPersonaToAttach : personaListNew) {
                personaListNewPersonaToAttach = em.getReference(personaListNewPersonaToAttach.getClass(), personaListNewPersonaToAttach.getCodigopersona());
                attachedPersonaListNew.add(personaListNewPersonaToAttach);
            }
            personaListNew = attachedPersonaListNew;
            unidadorganizacional.setPersonaList(personaListNew);
            List<Carro> attachedCarroListNew = new ArrayList<Carro>();
            for (Carro carroListNewCarroToAttach : carroListNew) {
                carroListNewCarroToAttach = em.getReference(carroListNewCarroToAttach.getClass(), carroListNewCarroToAttach.getPlaca());
                attachedCarroListNew.add(carroListNewCarroToAttach);
            }
            carroListNew = attachedCarroListNew;
            unidadorganizacional.setCarroList(carroListNew);
            unidadorganizacional = em.merge(unidadorganizacional);
            if (quienOld != null && !quienOld.equals(quienNew)) {
                quienOld.setUnidadorganizacional(null);
                quienOld = em.merge(quienOld);
            }
            if (quienNew != null && !quienNew.equals(quienOld)) {
                quienNew.setUnidadorganizacional(unidadorganizacional);
                quienNew = em.merge(quienNew);
            }
            if (direccionOld != null && !direccionOld.equals(direccionNew)) {
                direccionOld.setUnidadorganizacional(null);
                direccionOld = em.merge(direccionOld);
            }
            if (direccionNew != null && !direccionNew.equals(direccionOld)) {
                Unidadorganizacional oldUnidadorganizacionalOfDireccion = direccionNew.getUnidadorganizacional();
                if (oldUnidadorganizacionalOfDireccion != null) {
                    oldUnidadorganizacionalOfDireccion.setDireccion(null);
                    oldUnidadorganizacionalOfDireccion = em.merge(oldUnidadorganizacionalOfDireccion);
                }
                direccionNew.setUnidadorganizacional(unidadorganizacional);
                direccionNew = em.merge(direccionNew);
            }
            if (conveniosOld != null && !conveniosOld.equals(conveniosNew)) {
                conveniosOld.getUnidadorganizacionalList().remove(unidadorganizacional);
                conveniosOld = em.merge(conveniosOld);
            }
            if (conveniosNew != null && !conveniosNew.equals(conveniosOld)) {
                conveniosNew.getUnidadorganizacionalList().add(unidadorganizacional);
                conveniosNew = em.merge(conveniosNew);
            }
            if (conveniofinancieroOld != null && !conveniofinancieroOld.equals(conveniofinancieroNew)) {
                conveniofinancieroOld.getUnidadorganizacionalList().remove(unidadorganizacional);
                conveniofinancieroOld = em.merge(conveniofinancieroOld);
            }
            if (conveniofinancieroNew != null && !conveniofinancieroNew.equals(conveniofinancieroOld)) {
                conveniofinancieroNew.getUnidadorganizacionalList().add(unidadorganizacional);
                conveniofinancieroNew = em.merge(conveniofinancieroNew);
            }
            for (Proyecto proyectoListOldProyecto : proyectoListOld) {
                if (!proyectoListNew.contains(proyectoListOldProyecto)) {
                    proyectoListOldProyecto.getUnidadorganizacionalList().remove(unidadorganizacional);
                    proyectoListOldProyecto = em.merge(proyectoListOldProyecto);
                }
            }
            for (Proyecto proyectoListNewProyecto : proyectoListNew) {
                if (!proyectoListOld.contains(proyectoListNewProyecto)) {
                    proyectoListNewProyecto.getUnidadorganizacionalList().add(unidadorganizacional);
                    proyectoListNewProyecto = em.merge(proyectoListNewProyecto);
                }
            }
            for (Estudios estudiosListOldEstudios : estudiosListOld) {
                if (!estudiosListNew.contains(estudiosListOldEstudios)) {
                    estudiosListOldEstudios.getUnidadorganizacionalList().remove(unidadorganizacional);
                    estudiosListOldEstudios = em.merge(estudiosListOldEstudios);
                }
            }
            for (Estudios estudiosListNewEstudios : estudiosListNew) {
                if (!estudiosListOld.contains(estudiosListNewEstudios)) {
                    estudiosListNewEstudios.getUnidadorganizacionalList().add(unidadorganizacional);
                    estudiosListNewEstudios = em.merge(estudiosListNewEstudios);
                }
            }
            for (Persona personaListNewPersona : personaListNew) {
                if (!personaListOld.contains(personaListNewPersona)) {
                    Unidadorganizacional oldUnidadorganizacionalOfPersonaListNewPersona = personaListNewPersona.getUnidadorganizacional();
                    personaListNewPersona.setUnidadorganizacional(unidadorganizacional);
                    personaListNewPersona = em.merge(personaListNewPersona);
                    if (oldUnidadorganizacionalOfPersonaListNewPersona != null && !oldUnidadorganizacionalOfPersonaListNewPersona.equals(unidadorganizacional)) {
                        oldUnidadorganizacionalOfPersonaListNewPersona.getPersonaList().remove(personaListNewPersona);
                        oldUnidadorganizacionalOfPersonaListNewPersona = em.merge(oldUnidadorganizacionalOfPersonaListNewPersona);
                    }
                }
            }
            for (Carro carroListOldCarro : carroListOld) {
                if (!carroListNew.contains(carroListOldCarro)) {
                    carroListOldCarro.setUnidadorganizacional(null);
                    carroListOldCarro = em.merge(carroListOldCarro);
                }
            }
            for (Carro carroListNewCarro : carroListNew) {
                if (!carroListOld.contains(carroListNewCarro)) {
                    Unidadorganizacional oldUnidadorganizacionalOfCarroListNewCarro = carroListNewCarro.getUnidadorganizacional();
                    carroListNewCarro.setUnidadorganizacional(unidadorganizacional);
                    carroListNewCarro = em.merge(carroListNewCarro);
                    if (oldUnidadorganizacionalOfCarroListNewCarro != null && !oldUnidadorganizacionalOfCarroListNewCarro.equals(unidadorganizacional)) {
                        oldUnidadorganizacionalOfCarroListNewCarro.getCarroList().remove(carroListNewCarro);
                        oldUnidadorganizacionalOfCarroListNewCarro = em.merge(oldUnidadorganizacionalOfCarroListNewCarro);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = unidadorganizacional.getCodigounidad();
                if (findUnidadorganizacional(id) == null) {
                    throw new NonexistentEntityException("The unidadorganizacional with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Unidadorganizacional unidadorganizacional;
            try {
                unidadorganizacional = em.getReference(Unidadorganizacional.class, id);
                unidadorganizacional.getCodigounidad();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The unidadorganizacional with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Persona> personaListOrphanCheck = unidadorganizacional.getPersonaList();
            for (Persona personaListOrphanCheckPersona : personaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Unidadorganizacional (" + unidadorganizacional + ") cannot be destroyed since the Persona " + personaListOrphanCheckPersona + " in its personaList field has a non-nullable unidadorganizacional field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Quien quien = unidadorganizacional.getQuien();
            if (quien != null) {
                quien.setUnidadorganizacional(null);
                quien = em.merge(quien);
            }
            Direccion direccion = unidadorganizacional.getDireccion();
            if (direccion != null) {
                direccion.setUnidadorganizacional(null);
                direccion = em.merge(direccion);
            }
            Convenios convenios = unidadorganizacional.getConvenios();
            if (convenios != null) {
                convenios.getUnidadorganizacionalList().remove(unidadorganizacional);
                convenios = em.merge(convenios);
            }
            Conveniofinanciero conveniofinanciero = unidadorganizacional.getConveniofinanciero();
            if (conveniofinanciero != null) {
                conveniofinanciero.getUnidadorganizacionalList().remove(unidadorganizacional);
                conveniofinanciero = em.merge(conveniofinanciero);
            }
            List<Proyecto> proyectoList = unidadorganizacional.getProyectoList();
            for (Proyecto proyectoListProyecto : proyectoList) {
                proyectoListProyecto.getUnidadorganizacionalList().remove(unidadorganizacional);
                proyectoListProyecto = em.merge(proyectoListProyecto);
            }
            List<Estudios> estudiosList = unidadorganizacional.getEstudiosList();
            for (Estudios estudiosListEstudios : estudiosList) {
                estudiosListEstudios.getUnidadorganizacionalList().remove(unidadorganizacional);
                estudiosListEstudios = em.merge(estudiosListEstudios);
            }
            List<Carro> carroList = unidadorganizacional.getCarroList();
            for (Carro carroListCarro : carroList) {
                carroListCarro.setUnidadorganizacional(null);
                carroListCarro = em.merge(carroListCarro);
            }
            em.remove(unidadorganizacional);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Unidadorganizacional> findUnidadorganizacionalEntities() {
        return findUnidadorganizacionalEntities(true, -1, -1);
    }

    public List<Unidadorganizacional> findUnidadorganizacionalEntities(int maxResults, int firstResult) {
        return findUnidadorganizacionalEntities(false, maxResults, firstResult);
    }

    private List<Unidadorganizacional> findUnidadorganizacionalEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Unidadorganizacional.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Unidadorganizacional findUnidadorganizacional(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Unidadorganizacional.class, id);
        } finally {
            em.close();
        }
    }

    public int getUnidadorganizacionalCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Unidadorganizacional> rt = cq.from(Unidadorganizacional.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
